依旧是斜率优化的套路。
设 fi 表示前 i 个士兵的最大贡献,转移显然是枚举一个 j ,将 j+1 到 i 这些士兵组成特别行动队算贡献:
fi=max{fj+a(si−sj)2+b(si−sj)+c}其中 si 为战斗力的前缀和。这个方程是 O(n2) 的,需要优化。发现这个转移式貌似不满足单调队列优化的条件,于是将中间的式子拆开看看可不可以斜率优化。
fi=max{fj+a(s2i+s2j−2sisj)+b⋅si−b⋅sj+c}fi=max{fj+a⋅s2i+a⋅s2j−2a⋅sisj)+b⋅si−b⋅sj+c}fi=fj+a⋅s2i+a⋅s2j−2a⋅sisj+b⋅si−b⋅sj+cfj+a⋅s2i+a⋅s2j+b⋅si−b⋅sj+c=2a⋅si⋅sj+fi诶,是 y=kx+b 的形式,而且满足斜率优化的条件诶。继续将 x,y 找出来放到坐标系上( x=sj,y=fj+a⋅s2j−b⋅sj) 。
因为是 max ,所以用单调队列维护一下上凸壳然后转移即可,复杂度 O(n) 。
Code:
1 |
|
本文标题:【题解】 [APIO2010]特别行动队 斜率优化DP luoguP3628
文章作者:Qiuly
发布时间:2019年04月24日 - 00:00
最后更新:2019年04月28日 - 13:52
原始链接:http://qiulyblog.github.io/2019/04/24/[题解]luoguP3628/
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。
v1.5.2